package com.example.jdk7;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class java7Test  implements  AutoCloseable{
    public static void main(String[] args) throws IOException {

    BufferedInputStream bufferedInputStream;
//        2.数字字面量可以出现下划线

        Charset dd= Charset.forName("UTF-8");
        ByteBuffer bytef=dd.encode("UTF-8");
        dd.decode(bytef);

        ByteBuffer bytef2=ByteBuffer.allocate(1023);
        ByteBuffer bytechar=bytef2.putChar('a');
        System.out.println(bytechar);

        byte[] ssutf8= "sss".getBytes("UTF-8");

        int a = 10_0000_0000;
        long b = 0xffff_ffff_ffff_ffffl;
        byte c = 0b0001_1000;


//        int err1 = _11, err2=11_;
//        float err3=3._4,err4=3_.4;
        long err5=0x888_f;

//        3.switch 语句可以用字符串了

//        4.泛型实例的创建可以通过类型推断来简化
        //Map<String, List<String>> myMap = new HashMap<String, List<String>>();
        //可以简化为
        Map<String, List<String>> myMap = new HashMap<>();

//        5.在可变参数方法中传递非具体化参数（Non-Reifiable Formal Parameters）,改进编译警告和错误
        List l = new ArrayList<Number>();
        List<String> ls = l; // unchecked warning
        l.add(0, new Integer(42)); // another unchecked warning
        String s = ls.get(0); // ClassCastException is thrown

//        @SuppressWarnings({"unchecked", "varargs"})
//        public static <T> void addToList (List<T> listArg, T... elements) {
//            for (T x : elements) {
//                listArg.add(x);
//            }
//        }
//
//        要消除警告，可以有三种方式
//        1.加 annotation @SafeVarargs
//        2.加 annotation @SuppressWarnings({"unchecked", "varargs"})
//        3.使用编译器参数 –Xlint:varargs;


//        try 语句块中还可以同时处理多个资源,可以跟普通的try语句一样catch异常，有finally语句块
        Path mpath = Paths.get("E:/aaa.txt");
        Charset mcs = Charset.forName("Utf-8");

        try (
                BufferedWriter writer = java.nio.file.Files.newBufferedWriter(mpath, mcs);
                java.util.zip.ZipFile zf2 = new java.util.zip.ZipFile("");
        ) {
            zf2.getName();
        }catch(Exception e){

        }finally{
        }


//        7.Catch多个Exception，rethrow exception 改进了类型检测
//        很多时候，我们捕获了多个异常，却做了相同的事情，比如记日志，包装成新的异常，然后rethrow。这 时，代码就不那么优雅了，例如
        try{
            FileReader ff = new FileReader("");
        }catch (IOException ex) {
            //logger.log(ex);
            throw ex;
        }catch (Exception ex) {
                //logger.log(ex);
                throw ex;
            }

//        Jdk7允许捕获多个异常
        try{
            BufferedWriter writer = java.nio.file.Files.newBufferedWriter(mpath, mcs);
            java.util.zip.ZipFile zf2 = new java.util.zip.ZipFile("");

            File ff = new File("");
        } catch (IOException|ClassCastException ex) {
            //logger.log(ex);
        }
//        注意，catch后面的异常参数是final的，不能重新再复制

//        Rethrow  Exception更具包容性的类型检测
//        当你重新抛出多个异常时，不再需要详细定义异常类型了，编译器已经知道你具体抛出的是哪个异常了。
//       你 只需在方法定义的时候声明需要抛出的异常即可


    }

    private static void switchString(String str){
        switch(str){
            case "one":
                System.err.println("1");
                break;
            case "two":
                System.out.println("2");
                break;
            default :
                System.out.println("err");
        }
    }

//    jdk7提供了try-with-resources,可以自动关闭相关的资源（只要该资源实现了AutoCloseable接口，jdk7为绝
//    大部分资源对象都实现了这个接口）

    static String readFirstLineFromFile(String path) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader(path))) {
            return br.readLine();
        }
    }

    @Override
    public void close() throws Exception {

    }

    public void call() throws ReflectiveOperationException, IOException {
        try {
            //callWithReflection(arg);
        } catch (final Exception e) {
            //logger.trace("Exception in reflection", e);
            throw e;
        }
    }

}
